import sys, math, os
from tkinter import *
from PIL import Image  #创建缩略图
from PIL.ImageTk import PhotoImage  #显示jpg


def makeThumbs(imgdir, size=(100, 100), subdir='thumbs'):
    """
    获取一个目录下的所有图像的缩略图
    imgdir：图片目录
    size：图片尺寸
    subdir：缩略图目录
    """
    # 图片目录
    thumb_dir = os.path.join(imgdir, subdir)
    # 不存在就创建目录
    if not os.path.exists(thumb_dir):
        os.makedirs(thumb_dir)
    #缩略图
    thumbs = []
    # 遍历文件夹中的每一个文件
    for imgFile in os.listdir(imgdir):
        # 缩略图路径
        thumbPath = os.path.join(thumb_dir, imgFile)
        # 如果已存在
        if os.path.exists(thumbPath):
            thumbObj = Image.open(thumbPath)
            thumbs.append((imgFile, thumbObj))
        # 不存在，则新建
        else:
            print("创建缩略图：", thumbPath)
            # 图片路径
            imgPath = os.path.join(imgdir, imgFile)
            try:
                imgObj = Image.open(imgPath)
                # 创建缩略图
                imgObj.thumbnail(size, Image.ANTIALIAS)
                imgObj.save(thumbPath)
                thumbs.append((imgFile, imgObj))
            except:
                # 跳过
                print("跳过：", imgPath)
    return thumbs


class ViewOne(Toplevel):
    """查看一张图片"""
    def __init__(self, imgdir, imgfile):
        Toplevel.__init__(self)
        self.title(imgfile)
        imgpath = os.path.join(imgdir, imgfile)
        # 创建图片对象
        imgobj = PhotoImage(file=imgpath)
        # 图片标签
        Label(self, image=imgobj).pack()
        # 图像大小
        print(imgpath, imgobj.width(), imgobj.height())
        # 保留引用
        self.savephoto = imgobj


def viewer(imgdir, kind=Toplevel, cols=None):
    """图片查看器"""
    win = kind()
    win.title = "查看图片文件夹：" + imgdir
    quit = Button(win, text='退出', command=win.quit, bg='beige')
    quit.pack(fill=X, side=BOTTOM)
    # 缩略图
    thumbs = makeThumbs(imgdir)
    # 创建列
    if not cols:
        cols = int(math.ceil(math.sqrt(len(thumbs))))
    # 保存图片
    savephotos = []
    while thumbs:
        thumbsrow, thumbs = thumbs[:cols], thumbs[cols:]
        # 创建一行
        row = Frame(win)
        row.pack(fill=BOTH)
        # 展示图片
        for (imgfile, imgboj) in thumbsrow:
            # 图像
            photo = PhotoImage(imgboj)
            # 链接
            link = Button(row, image=photo)
            #控制器
            handler = lambda savefile=imgfile: ViewOne(imgdir, savefile)
            link.config(command=handler)
            link.pack(side=LEFT, expand=YES)
            # 追加
            savephotos.append(photo)
    return win, savephotos


if __name__ == '__main__':
    imgdir = 'C:\\Users\\18010\\Pictures\\bg'
    main, save = viewer(imgdir, kind=Tk)
    main.mainloop()